package main

import "fmt"

type User struct {
	id   int
	name string
}

func test1() {
	u := User{1, "Tom"}
	var i interface{} = u

	u.id = 2
	u.name = "dong"

	fmt.Printf("%v\n", u)
	// 对结构体重新赋值并不会改变接口值
	fmt.Printf("%v\n", i.(User))
}

func test2() {
	u := User{1, "Tom"}
	var vi, pi interface{} = u, &u // 接口指向变量u,对接口修改同时对变量u修改
	// vi.(User).name = "Dong" // cannot assign to vi.(User).name
	pi.(*User).name = "Xixi"
	fmt.Println(vi.(User))
	fmt.Println(pi.(*User))
	fmt.Println(u)
}

func test3() {
	var vi interface{} = nil
	var pi interface{} = (*int)(nil)

	fmt.Println(vi == nil)
	fmt.Println(pi == nil)

}

func main() {
	// fmt.Println("接口执行机制")
	// test1()
	// fmt.Println("使用临时对象，指针方式修改接口")
	// test2()
	fmt.Println("接口的零值，只有tab&data都为nil时接口为nil")
	test3()

}
